import { FFmpegTask } from './base'

/**
 * 视频格式转换选项
 */
export interface ConvertOptions {
  input: string // 输入文件路径
  output: string // 输出文件路径
  format?: string // 输出格式 (mp4, avi, mov, mkv, webm等)
  videoCodec?: string // 视频编码 (h264, h265, vp9等)
  audioCodec?: string // 音频编码 (aac, mp3, opus等)
  videoBitrate?: string // 视频码率 (如 '2M')
  audioBitrate?: string // 音频码率 (如 '192k')
  fps?: number // 帧率
  resolution?: string // 分辨率 (如 '1920x1080')
  preset?: 'ultrafast' | 'superfast' | 'veryfast' | 'faster' | 'fast' | 'medium' | 'slow' | 'slower' | 'veryslow'
}

/**
 * 视频格式转换
 */
export function convertVideo(options: ConvertOptions): FFmpegTask {
  const args: string[] = [
    '-i',
    options.input,
    '-y' // 覆盖输出文件
  ]

  // 视频编码
  if (options.videoCodec) {
    args.push('-c:v', options.videoCodec)
  }

  // 音频编码
  if (options.audioCodec) {
    args.push('-c:a', options.audioCodec)
  }

  // 视频码率
  if (options.videoBitrate) {
    args.push('-b:v', options.videoBitrate)
  }

  // 音频码率
  if (options.audioBitrate) {
    args.push('-b:a', options.audioBitrate)
  }

  // 帧率
  if (options.fps) {
    args.push('-r', String(options.fps))
  }

  // 分辨率
  if (options.resolution) {
    args.push('-s', options.resolution)
  }

  // 编码预设
  if (options.preset) {
    args.push('-preset', options.preset)
  }

  // 格式
  if (options.format) {
    args.push('-f', options.format)
  }

  args.push(options.output)

  return new FFmpegTask(args, options.input)
}

/**
 * 音频格式转换
 */
export interface AudioConvertOptions {
  input: string
  output: string
  format?: string // mp3, wav, aac, flac等
  bitrate?: string // 如 '192k'
  sampleRate?: number // 采样率 如 44100
  channels?: number // 声道数 1=单声道 2=立体声
}

export function convertAudio(options: AudioConvertOptions): FFmpegTask {
  const args: string[] = ['-i', options.input, '-y']

  // 只处理音频流
  args.push('-vn')

  // 音频编码（根据格式自动选择）
  if (options.format) {
    const codecMap: Record<string, string> = {
      mp3: 'libmp3lame',
      wav: 'pcm_s16le',
      aac: 'aac',
      flac: 'flac',
      opus: 'libopus'
    }
    const codec = codecMap[options.format]
    if (codec) {
      args.push('-c:a', codec)
    }
  }

  if (options.bitrate) {
    args.push('-b:a', options.bitrate)
  }

  if (options.sampleRate) {
    args.push('-ar', String(options.sampleRate))
  }

  if (options.channels) {
    args.push('-ac', String(options.channels))
  }

  args.push(options.output)

  return new FFmpegTask(args, options.input)
}
